import { createStore, Store } from 'vuex'
/**
 * @Des: 对store进行二次封装，封装成为一个按照特定格式进行添加移除module，以及存取值的工具。
 * 动态装配 store 难度过高，因为涉及的量会很大，所以设定结构，作为stat的方式进行全局存储。
 * 后去通过对出入参的获取方式进行控制。利用state的全局存储能力，不使用其内置方法。
 * 使用过程使用compute方式进行。
 * @Date:  2022-03-14 
 * @Author: willing
 */


const store: Store<any> = createStore({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

export default function getStore(): Store<any> {
  return store
}




// parentModuleName 必须已经注册
store.registerModule(['parentModuleName', 'currentModuleName'], {/*moduleOptions*/ })

export function registerModule(moduleName: string, moduleOptions: any) {
  store.registerModule('home', {
    namespaced: true,
    state: {
      homeCount: 10,
    },
    getters: {
      getHomeCount(state) {
        return state.homeCount * 2
      }
    },
    mutations: {
      increment(state, payload = 10) {
        state.homeCount += payload
      }
    },
    actions: {
      increment(ctx, payload = 10) {
        ctx.commit('increment', payload)
      },
      homeIncrement: {
        root: true,
        handler(ctx, payload = 10) {
          ctx.commit('increment', payload)
        }
      }
    }
  })
  store.registerModule(moduleName, moduleOptions);
}

export function unregisterModule(moduleName: string) {

  store.unregisterModule(moduleName);
}




/**
 *  this.$*/


interface BearStore {
  // 公共参数。
  common: Map<string, string>


}

